package com.ww.learn.oop

// sealed类的构造函数没有标记为private，但是它们被认为是private的
// 在任何其他文件中编写的任何类型试图从Card继承都将失败

// sealed类的构造函数被认为是private的，所以我们不能实例化这些类的对象
// 但是，我们可以创建从sealed类继承的类的对象，假设它们的构造函数没有显式地标记为private
sealed class Card(val suit: String)

class Ace(suit: String) : Card(suit)

class King(suit: String) : Card(suit) {
    override fun toString() = "King of $suit"
}

class Queen(suit: String) : Card(suit) {
    override fun toString() = "Queen of $suit"
}

class Jack(suit: String) : Card(suit) {
    override fun toString() = "Jack of $suit"
}

class Pip(suit: String, val number: Int) : Card(suit) {
    init {
        if (number < 2 || number > 10) {
            throw RuntimeException("Pip has to be between 2 and 10")
        }
    }
}